在Java中重载和重写静态和非静态方法
我试图理解重载和重写静态和非静态方法是如何工作的。事实上,我正试图理解这些方法通常是如何出现在父类和子类中的。我提出了以下规则:
- 我们不能覆盖静态方法,而是隐藏它们。通过隐藏,我们的意思是在编译时根据引用变量类型决定执行哪个方法,而不是重写(,在重写中,根据实例类型选择在运行时执行哪个方法)
e、 让class B extends A
,然后static B.method()
隐藏static A.method()
李> - 我们可以覆盖实例方法
e、 g.B.method()
覆盖A.method()
李> - 具有相同签名的两个或多个方法不能以静态或非静态的任何组合存在于同一类中
e、 g.B
不能同时包含static method(float)
和method(float)
李> - 具有不同签名的两个或多个方法可以以静态或非静态的任意组合存在于同一类中
e、 g.B
可以包含static method()
、static method(int)
和method(float)
- 静态方法不能重写非静态方法
e、 g.B.method()
无法覆盖static B.method()
- 非静态方法不能重写静态方法
e、 g.static B.method()
无法覆盖B.method()
我的这些看法正确吗?我还错过了什么规则吗
# 1 楼答案
他们基本上是正确的。我将3和4更改为:
在类型擦除之后,同一类中不能存在静态或非静态组合中具有相同签名的两个或多个方法
在类型擦除之后,具有不同签名的两个或多个方法可以以静态或非静态的任意组合存在于同一类中
例如,在同一个类中不能有
method(List<String>)
和method(List<Integer>)
。事实上,它们中的一个不能在父类中,另一个不能在子类中。因为不管怎样,你都是overloading a method where the formal parameter types of each overload erase to the same raw type另外,您还没有提到任何有关重载的规则。。。一般规则是,只要两个方法在同一个类中(或其中一个从父类继承),并且它们的名称相同,但它们不会相互重写>;它们是彼此的重载
在我看来,您的“规则”对于学习Java的人来说非常有用,但是如果您对如何以更严格的方式表达这一点感兴趣,请查看Language Specification,特别是§8.4.8关于重写&;躲藏。您的大多数规则要么在其中明确说明,要么是其中声明的结果。通过阅读语言规范,您还可以发现遗漏了什么
# 2 楼答案
规则:
Polymorphism
适用于重写,而不是重载李>Overriding
是一个运行时概念,而重载是一个编译时概念李>多态性->; 实际对象类型@runtime(而不是引用变量的类型)决定使用哪种
overridde
方法。相反,引用类型决定在编译时使用哪个overload
方法关于静态方法: 它们不能被重写,但在Java中可以被重载和隐藏